<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: zhangyajun <448901948@qq.com>
// +----------------------------------------------------------------------
namespace app\cms\paginator;

use think\Paginator;

class Page extends Paginator
{
	/**
	 * 上一页按钮
	 * @param string $text
	 * @return string
	 */
	protected function getPreviousButton($text = "&laquo;")
	{
		if ($this->currentPage() <= 1) {
			return $this->getDisabledTextWrapper($text);
		}
		$url = $this->url(
			$this->currentPage() - 1
		);
		return $this->getPageLinkWrapper($url, $text);
	}
	/**
	 * 下一页按钮
	 * @param string $text
	 * @return string
	 */
	protected function getNextButton($text = '&raquo;')
	{
		if (!$this->hasMore) {
			return $this->getDisabledTextWrapper($text);
		}
		$url = $this->url($this->currentPage() + 1);
		return $this->getPageLinkWrapper($url, $text);
	}
	/**
	 * 页码按钮
	 * @return string
	 */
	protected function getLinks()
	{
		if ($this->simple) {
			return '';
		}
		$block = [
			'first' => null,
			'slider' => null,
			'last' => null,
		];
		$side = 3;
		$window = $side * 2;
		if ($this->lastPage < $window + 6) {
			$block['first'] = $this->getUrlRange(1, $this->lastPage);
		} elseif ($this->currentPage <= $window) {
			$block['first'] = $this->getUrlRange(1, $window + 2);
			$block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage);
		} elseif ($this->currentPage > ($this->lastPage - $window)) {
			$block['first'] = $this->getUrlRange(1, 2);
			$block['last'] = $this->getUrlRange($this->lastPage - ($window + 2), $this->lastPage);
		} else {
			$block['first'] = $this->getUrlRange(1, 2);
			$block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side);
			$block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage);
		}
		$html = '';
		if (is_array($block['first'])) {
			$html .= $this->getUrlLinks($block['first']);
		}
		if (is_array($block['slider'])) {
			$html .= $this->getDots();
			$html .= $this->getUrlLinks($block['slider']);
		}
		if (is_array($block['last'])) {
			$html .= $this->getDots();
			$html .= $this->getUrlLinks($block['last']);
		}
		return $html;
	}
	/**
	 * 渲染分页html
	 * @return mixed
	 */
	public function render()
	{
		if ($this->hasPages()) {
			if ($this->simple) {
				return sprintf(
					'<ul id="pager">%s %s</ul>',
					$this->getPreviousButton(),
					$this->getNextButton()
				);
			} else {
				return sprintf(
					'<ul id="pages">%s %s %s</ul>',
					$this->getPreviousButton(),
					$this->getLinks(),
					$this->getNextButton()
				);
			}
		}
	}
	/**
	 * 生成一个可点击的按钮
	 *
	 * @param  string $url
	 * @param  int    $page
	 * @return string
	 */
	protected function getAvailablePageWrapper($url, $page)
	{
		return '<li><a href="' . htmlentities($url) . '">' . $page . '</a></li>';
	}
	/**
	 * 生成一个禁用的按钮
	 *
	 * @param  string $text
	 * @return string
	 */
	protected function getDisabledTextWrapper($text)
	{
		return '<li class="disabled"><span>' . $text . '</span></li>';
	}
	/**
	 * 生成一个激活的按钮
	 *
	 * @param  string $text
	 * @return string
	 */
	protected function getActivePageWrapper($text)
	{
		return '<li class="active"><span>' . $text . '</span></li>';
	}
	/**
	 * 生成省略号按钮
	 *
	 * @return string
	 */
	protected function getDots()
	{
		return $this->getDisabledTextWrapper('...');
	}
	/**
	 * 批量生成页码按钮.
	 *
	 * @param  array $urls
	 * @return string
	 */
	protected function getUrlLinks(array $urls)
	{
		$html = '';
		foreach ($urls as $page => $url) {
			$html .= $this->getPageLinkWrapper($url, $page);
		}
		return $html;
	}
	/**
	 * 生成普通页码按钮
	 *
	 * @param  string $url
	 * @param  int    $page
	 * @return string
	 */
	protected function getPageLinkWrapper($url, $page)
	{
		if ($this->currentPage() == $page) {
			return $this->getActivePageWrapper($page);
		}
		return $this->getAvailablePageWrapper($url, $page);
	}

    /**
     * cms定义url path格式
     * thinkphp/library/think/paginator.php
     */
    protected function url($page)
    {
        if(isset(cache("Cms_Config")['site_cat_url']) && 1 == cache("Cms_Config")['site_cat_url']) {
            $slash = "/";
        }else{
            $slash = "";
        }
        //后续代码与库文件一致
        if ($page <= 0) {
            $page = 1;
        }

        if (strpos($this->options['path'], '[PAGE]') === false) {
            $parameters = [$this->options['var_page'] => $page];
            $path       = $this->options['path'];
        } else {
            $parameters = [];
            $path       = str_replace('[PAGE]', $page, $this->options['path']);
        }

        if (count($this->options['query']) > 0) {
            $parameters = array_merge($this->options['query'], $parameters);
        }

        $url = $path;
        if (!empty($parameters)) {
            $url .= $slash .'?' . http_build_query($parameters, null, '&');
        }

        return $url . $this->buildFragment();
    }
}
